// 这里的vm，就是我们在vue文件里面的this，所以我们能在这里获取vuex的变量，比如存放在里面的token
// 同时，我们也可以在此使用getApp().globalData，如果你把token放在getApp().globalData的话，也是可以使用的
import BASECONFIG from './config.js';

module.exports = vm => {
	// 初始化请求配置
	uni.$u.http.setConfig(config => {
		/* config 为默认全局配置 */
		config.baseURL = BASECONFIG.baseUrl; /* 根域名 */

		config.dataType = 'json'; // 设置为json，返回后会对数据进行一次JSON.parse()
		// 配置请求头信息
		config.header = {
			'content-type': 'application/x-www-form-urlencoded',
		};

		return config;
	});

	var timeout = null;

	// 请求拦截器
	uni.$u.http.interceptors.request.use(
		async config => {
			// 可使用async await 做异步操作
			// 在这里判断config.url的前缀 修改baseUrl
			// config = proxy(config, '^/server_2/', GLOBAL_CONFIG.marketingBaseUrl); // 多个服务器配置
			// config = proxy(config, '^/server_3/', GLOBAL_CONFIG.examBaseUrl); // 多个服务器配置

			// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
			let userinfo = vm.$store.state.user.userInfo;
			if (!uni.$u.test.isEmpty(userinfo) && !uni.$u.test.isEmpty(userinfo.ecapiUrl)) {
				const reg = /((https|http|ftp|file):\/\/)([A-Za-z0-9\-.]+)(:[0-9]+){0,1}/g;
				const arr = userinfo.ecapiUrl.match(reg);
				config.baseURL = arr[0] + '/xz-ec-api';
			} else {
				config.baseURL = BASECONFIG.baseUrl;
			}

			config.data = config.data || {};
			config.params = config.params || {};

			if (!uni.$u.test.isEmpty(userinfo)) {
				config.header.userType = userinfo.userType;
				config.header.token = userinfo.token;
				config.header.tenantId = userinfo.tenantId;
				config.header.userId = userinfo.userId;
			}

			return config;
		},
		error => Promise.reject(error), // 可使用async await 做异步操作
	);

	// 响应拦截器
	uni.$u.http.interceptors.response.use(
		async response => {
			/* 对响应成功做点什么 可使用async await 做异步操作*/

			const data = response.data;
			// 自定义参数

			const custom = response.config?.custom;
			if (response.statusCode !== 200) {
				// 服务端返回的状态码不等于200，则reject()
				// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
				if (custom.toast !== false) {
					uni.$u.toast(data.msg);
				}
				// 如果需要catch返回，则进行reject
				if (custom?.catch) {
					return Promise.reject(data);
				} else {
					// 否则返回一个pending中的promise
					return new Promise(() => {});
				}
			} else {
				//接口响应成功了

				if (
					response.config.fullPath.indexOf('https://dz.shopec.com.cn/client-api-test/') >
					-1
				) {
					if (data.code == 200) {
						return data.data == null || data.data == undefined ? {} : data.data;
					} else {
						return Promise.reject(data.msg);
					}
				}

				if (data.code == 1) {
					// 这里对res.data进行返回，将会在this.$u.post(url).then(res => {})的then回调中的res的到
					return data.data == null || data.data == undefined ? {} : data.data;
				} else if (data.code == 2007) {
					console.log('登录失效了');

					if (timeout) {
						clearTimeout(timeout);
					}

					timeout = setTimeout(() => {
						// 2007为token失效，这里跳转登录
						uni.$u.toast('验证失败，请重新登录');
						console.log('跳转登录页面');
						// 此为uView的方法，详见路由相关文档
						vm.$u.route('/pages/login/login');
					}, 1500);

					// setTimeout(() => {
					// 	// 此为uView的方法，详见路由相关文档
					// 	vm.$u.route('/pages/login/login')
					// }, 1500)
					return Promise.reject(data.msg);
				} else {
					console.log('请求失败了', data);
					// 如果返回false，则会调用Promise的reject回调，
					// 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
					if (!uni.$u.test.isEmpty(data.msg)) {
						uni.$u.toast(data.msg);
					}
					return Promise.reject(data.msg);
				}
			}
		},
		error => Promise.reject(error), // 可使用async await 做异步操作
	);
};

// const install = (Vue, vm) => {
// 	//1.基础配置
// 	Vue.prototype.$u.http.setConfig({
// 		/*配置域名*/
// 		//开发环境
// 		// baseUrl: 'http://139.9.238.105:8126/xz-ec-api',
// 		//演示环境
// 		// baseUrl: 'http://119.3.209.214:8083/xz-ec-api',
//         //荣恒
//         baseUrl: config.baseUrl,
// 		dataType: 'json', // 设置为json，返回后会对数据进行一次JSON.parse()
// 		showLoading: true, // 是否显示请求中的loading
// 		loadingText: '请求中...', // 请求loading中的文字提示
// 		loadingTime: 100, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
// 		originalData: false, // 是否在拦截器中返回服务端的原始数据
// 		loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
// 		// 配置请求头信息
// 		header: {
// 			'content-type': 'application/x-www-form-urlencoded',

// 		},
// 	});
// 	// 2.请求拦截，配置Token等参数
// 	Vue.prototype.$u.http.interceptor.request = (config) => {
// 	  // console.log('获取到缓存的数据--'+ vm.vuex_userInfo.userType);
//            config.header.userType = vm.vuex_userInfo.userType;
// 		   config.header.token = vm.vuex_userInfo.token;
// 		   config.header.tenantId = vm.vuex_userInfo.tenantId;
// 		   config.header.userId = vm.vuex_userInfo.userId;

// 		   // config.header.userType = "1";
// 		   // config.header.token = "1c14aa0117684391800a553598416f43M2ZK5WOWMqSEsPSh0KW0rw==";
// 		   // config.header.tenantId = "";
// 		   // config.header.userId = 1;

// 		// 可以对某个url进行特别处理，此url参数为this.$u.get(url)中的url值
// 		// if (config.url == '/user/login') config.header.noToken = true;

// 		return config;
// 	}

// 	var timeout = null;

// 	// 3.响应拦截，判断状态码是否通过
// 	Vue.prototype.$u.http.interceptor.response = (res) => {
// 		console.log('收到返回数据--->');
// 		console.log(res);
// 		if (res.code == 1) {
// 			// 这里对res.data进行返回，将会在this.$u.post(url).then(res => {})的then回调中的res的到
// 			return res.data;
// 		} else if (res.code == 2007) {
// 			console.log('登录失效了');

// 			if (timeout) {
// 				clearTimeout(timeout)
// 			}

// 			timeout = setTimeout(() => {
// 				// 2007为token失效，这里跳转登录
// 				vm.$u.toast('验证失败，请重新登录');
// 				console.log('跳转登录页面');
// 				// 此为uView的方法，详见路由相关文档
// 				vm.$u.route('/pages/login/login')
// 			}, 1500);

// 			// setTimeout(() => {
// 			// 	// 此为uView的方法，详见路由相关文档
// 			// 	vm.$u.route('/pages/login/login')
// 			// }, 1500)
// 			return false;
// 		} else {
// 			// 如果返回false，则会调用Promise的reject回调，
// 			// 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
// 				vm.$u.toast(res.msg?res.msg:"接口异常,请联系管理员");
// 			return false;
// 		}
// 	}
// }

// export default {
// 	install
// }
